package cinvestav.adviseme.webservice;

import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.security.userdetails.ldap.Person;

import cinvestav.adviseme.controller.SolicitudController;
import cinvestav.adviseme.datamodel.Persona;
import cinvestav.adviseme.datamodel.Solicitud;
import cinvestav.adviseme.util.DBException;
import cinvestav.adviseme.util.QueryParamDictionary;

@Path("/solicitud")
public class SolicitudWebService {
	SolicitudController solicitudController;
	private static Logger log = Logger.getLogger(SolicitudWebService.class
			.getName());

	public SolicitudWebService() throws DBException {
		solicitudController = new SolicitudController();
	}

	@GET
	@Produces({ MediaType.APPLICATION_JSON })
	@Path("/getAll")
	public List<Solicitud> getAllSolicitudes() {
		try {
			return solicitudController.getAll();
		} catch (Exception e) {
			// TODO: handle exception
			log.log(Level.SEVERE, null, e);
			throw new WSErrorException(e.getMessage());
		}
	}

	@GET
	@Produces({ MediaType.APPLICATION_JSON })
	@Path("/getSolicitudesPentientes")
	public List<Solicitud> getSolicitudesPentientes(
			@QueryParam(QueryParamDictionary.PERSONA_ID_PARAM) String id_Per) {
		try {
			log.log(Level.INFO, "GET PERSONA ID=" + id_Per);
			Persona personafiltro = new Persona();
			personafiltro.setId(Integer.parseInt(id_Per));
			List<Solicitud> res = solicitudController
					.getPendingRequest(personafiltro);
			if (res.isEmpty())
				res.add(new Solicitud());
			log.log(Level.INFO, "GET SOLICITUDES RES=" + res);
			return res;
		} catch (DBException e) {
			// TODO Auto-generated catch block
			log.log(Level.SEVERE, null, e);
			throw new WSErrorException(e.getMessage());
		}

	}

	@POST
	@Produces({ MediaType.APPLICATION_JSON })
	@Consumes({ MediaType.APPLICATION_JSON })
	@Path("/enviarSolicitud")
	public Solicitud getEnviarSolicitud(JSONObject requestSolicitudJSON) {
		// Los parametros se obtienen como un objeto JSON y es necesario
		// realizar el parseo

		// Objeto que almacenara la solicitud en formato JSON
		JSONObject solicitudJSON;
		// Objeto que almacenara al solicitado en formato JSON
		JSONObject solicitadoJSON;
		// Objeto que almacenara al solicitante en formato JSON
		JSONObject solicitanteJSON;
		// Lista de resultados
		List<Solicitud> res = new LinkedList<Solicitud>();
		// Solicitud y personas involucradas en ella
		Solicitud solicitud = new Solicitud();

		try {
			log.log(Level.INFO, "request = " + requestSolicitudJSON.toString());
			// Se obtiene el objeto JSON del REQUEST, mediante el nombre
			// de parametro ingresado
			solicitudJSON = new JSONObject(
					requestSolicitudJSON
							.getString(QueryParamDictionary.SOLICITUD_PARAM));
			solicitadoJSON = solicitudJSON.getJSONObject("solicitado");
			solicitanteJSON = solicitudJSON.getJSONObject("solicitante");

			log.log(Level.INFO, "Solicitud = " + solicitudJSON.toString());
			log.log(Level.INFO, "Solicitado = " + solicitadoJSON.toString());
			log.log(Level.INFO, "Solicitante = " + solicitanteJSON.toString());

			solicitud.getSolicitante().setId(solicitanteJSON.getInt("id"));
			solicitud.getSolicitado().setId(solicitadoJSON.getInt("id"));
			solicitud.setEstado(solicitudJSON.getInt("estado"));
			solicitud.setFechaSolicitud(solicitudJSON
					.getString("fechaSolicitud"));

			log.log(Level.INFO, "Solicitud= " + solicitud);
		} catch (JSONException e) {
			// Si ocurre un error al parsear los parametros se retorna este
			// error al cliente
			log.log(Level.SEVERE, null, e);
			throw new WSErrorException("PARAMETROS INCORRECTOS");
		}

		try {
			solicitudController.insert(solicitud);
			return new Solicitud();
		} catch (DBException e) {
			// TODO Auto-generated catch block
			log.log(Level.SEVERE, null, e);
			throw new WSErrorException(e.getMessage());
		}
	}

	@POST
	@Produces({ MediaType.APPLICATION_JSON })
	@Path("/actualizarSolicitud")
	public Solicitud actualizarSolicitud(JSONObject solicitudObject) {
		try {

			JSONObject jsonSolicitud;
			JSONObject jsonPersonaSolicitante;
			JSONObject jsonPersonaSolicitada;
			
			Solicitud solicitud = new Solicitud();
			Persona personaSolicitante = new Persona();
			Persona personaSolicitada = new Persona();
			
			try {
				Logger.getLogger(SolicitudWebService.class.getName()).log(
						Level.INFO, "request = " + solicitudObject.toString());
				
				jsonSolicitud = new JSONObject(solicitudObject.getString(QueryParamDictionary.SOLICITUD_PARAM));
				solicitud.setId(jsonSolicitud.getInt("id"));
				solicitud.setEstado(jsonSolicitud.getInt("estado"));	
				jsonPersonaSolicitante = jsonSolicitud.getJSONObject("solicitante");
				jsonPersonaSolicitada = jsonSolicitud.getJSONObject("solicitado");
				personaSolicitante.setId(jsonPersonaSolicitante.getInt("id"));
				personaSolicitada.setId(jsonPersonaSolicitada.getInt("id"));
				solicitud.setSolicitante(personaSolicitante);
				solicitud.setSolicitado(personaSolicitada);
				
				Boolean resp = solicitudController.update(solicitud);
				if (resp){
					return new Solicitud();
				}else{
					throw new WSErrorException("Actualizacion no completada");
				}				
			} catch (JSONException e) {
				// TODO: handle exception
				Logger.getLogger(ComentarioWebService.class.getName()).log(Level.SEVERE,null,e);
				throw new WSErrorException("PARAMETROS INCORRECTOS");
			}

		} catch (DBException e) {
			// TODO: handle exception
			Logger.getLogger(ComentarioWebService.class.getName()).log(
					Level.SEVERE, null, e);
			throw new WSErrorException(e.getMessage());
		}	
	}

}
